using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            //peten hesel ze souboru
            FileStream proudhesla = new FileStream(@"hesla.ini", FileMode.Open, FileAccess.Read);
            StreamReader prectihesla = new StreamReader(proudhesla);
            string hesloa = prectihesla.ReadLine();
            string heslob = prectihesla.ReadLine();

            while (1 > 0)   //zatek nekonen smyky
            {
                try
                {
                    //inicializace promnnch
                    int pocet = 0;
                    int zapisy = 0;
                    double soucet = 0;
                    double count = 0;
                    double luxhodnota = 0;
                    double prumer = 0;
                    bool cist = false;

                    //vytvoen objekt pro ten ze soubor
                    string soubor = string.Format("{0}.txt", DateTime.Now.ToString("yyyyMMdd"));
                    FileStream proud = new FileStream(@soubor, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    StreamReader precti = new StreamReader(proud);
                    FileStream proud2 = new FileStream(@"last.ini", FileMode.Open, FileAccess.Read);
                    StreamReader precti2 = new StreamReader(proud2);

                    //peten poslednho zpracovanho asu a data, uzaven proud pro ten
                    string posledni = precti2.ReadLine();
                    string datum = precti2.ReadLine();
                    precti2.Close();
                    proud2.Close();

                    if (datum != DateTime.Now.ToString("yyyy-MM-dd"))   //pokud posledn datum nen dnen
                    {
                        cist = true;    //bude se st
                        //uloen nzvu uploadovanho souboru do promnn upload
                        string[] datvc = datum.Split('-');
                        string upload = (datvc[0] + datvc[1] + datvc[2] + ".txt");
                        try
                        {
                            //vyzkou uploadu souboru na databzov server lightmeteru
                            WebClient klient = new WebClient();
                            klient.Credentials = new NetworkCredential("f002838b", hesloa);
                            klient.UploadFile(@"ftp://kuffner-sternwarte.at/Licht/L039/" + upload, @upload);
                            Console.WriteLine("Data byla spn uploadovna do databze!");
                        }
                        catch
                        {
                            //pokud upload nefunguje, vype do konzole chybov hlen
                            Console.WriteLine("Data nebyla uploadovna do databze.");
                        }
                    }
                    StreamWriter pokus = new StreamWriter("data.dat", false, System.Text.Encoding.UTF8);
                    pokus.Write("");
                    pokus.Close();

                    //ten ze souboru - postupn se petou vechny dky
                    string radek;
                    while ((radek = precti.ReadLine()) != null)
                    {
                        //rozdlen petenho dku na jednotliv poloky
                        string[] data = radek.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                        //pokud je as na petenm dku stejn jako as poslednho zapisovn,
                        //bude se st
                        if (data[1].Trim() == posledni.Trim())
                        {
                            cist = true;
                        }

                        if (cist == true)   //pokud se bude st
                        {
                            //promnn count se piad hodnota odeten z lightmeteru
                            count = Double.Parse(data[3].Trim());

                            //pokud je vt ne 500 000 (1 lx), pouije se sloitj vzorec pro pevod
                            if (count > 500000)
                            {
                                luxhodnota = (0.0000002 * (count + Math.Exp(count / 87000)));
                            }
                            //v opanm ppad se pouije jednodu
                            else { luxhodnota = (count * 0.000002); }

                            soucet += luxhodnota;
                            pocet++;

                            //oven, zda u jsou zpracovny vechny dky v seku 5 minut
                            string[] rozdposl = posledni.Trim().Split(':');
                            string[] rozdsouc = data[1].Trim().Split(':');
                            int cas1 = Int32.Parse(rozdposl[1].Trim());
                            int cas2 = Int32.Parse(rozdsouc[1].Trim());
                            int rozdil = Math.Abs(cas1 - cas2);
                            if (rozdil >= 5)
                            {
                                //vpoet aritmetickho prmru hodnot v seku 5 minut
                                prumer = Math.Round((soucet / pocet), 3);
                                pocet = 0;
                                soucet = 0;
                                zapisy++;

                                //zpis poslednho zpracovanho data a asu do soubotu last.ini
                                FileStream proud3 = new FileStream(@"last.ini", FileMode.Create, FileAccess.Write);
                                StreamWriter zapis = new StreamWriter(proud3);
                                posledni = data[1].Trim();
                                zapis.WriteLine(data[1].Trim());
                                zapis.WriteLine(data[0].Trim());
                                zapis.Close();
                                proud3.Close();

                                //zpis aritmetickho prmru, data a asu do souboru data.dat
                                StreamWriter zapis2 = new StreamWriter("data.dat", true, System.Text.Encoding.UTF8);
                                zapis2.WriteLine(data[0].Trim() + ";" + data[1].Trim() + ";" + prumer);
                                zapis2.Close();
                            }
                        }
                    }
                    precti.Close();
                    proud.Close();

                    //pokud byla do souboru data.dat zapsna alespo jedna hodnota
                    if (zapisy != 0)
                    {
                        //vype do konzole hlen o spchu
                        Console.WriteLine("Data spn zapsna " + DateTime.Now.ToString("hh:mm") + ".");
                        
                        try
                        {
                            //pokus se uploadovat soubor data.dat na server
                            WebClient klient = new WebClient();
                            klient.Credentials = new NetworkCredential("osvetleni.gjwprostejov.cz", heslob);
                            klient.UploadFile(@"ftp://ftp.gjwprostejov.cz/data.dat", @"data.dat");
                            
                            Console.WriteLine("Data byla spn uploadovna " + DateTime.Now.ToString("hh:mm") + "!");
                        }
                        catch
                        {
                            //pokud upload nefunguje, vype do konzole chybov hlen
                            Console.WriteLine("Nepodailo se data uploadovat.");
                        }
                    }
                    else
                    {
                        //pokud nebyly do souboru data.dat zapsny dn nov daje,
                        //vype do konzole hlen
                        Console.WriteLine("Nenalezena nov data.");
                    }
                }
                catch
                {
                    //pokud v cyklu nco sele, vype chybov hlen do konzole
                    Console.WriteLine("Data se nepodailo zpracovat.");
                }
                //Pok 10 minut, pak nekonen smyka probhne znovu
                Thread.Sleep(600000);
            }
        }
    }
}
